/*
package advance.codec;

*/
/**
 * 提供<a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>所定义的 Base64 编码和解码.
 * <p>此类实现了<cite>6.8.Base64 Content-Transfer-Encoding</cite>RFC 2045</p>
 * <cite> 多用途
 * 邮件扩展(MIME): 邮件格式
 * </cite>
 * <p>可以使用各种构造函数以以下方式对类进行参数化
 * <ul>
 *     <li>URL 安全模式: 默认为关闭</li>
 *     <li>行长: 默认为 76，最终为 4 的倍数</li>
 *     <li>行分隔符: 默认为CRLF("\r\n")</li>
 * </ul>
 * <p>由于此类直接操作 byte streams, 不是操作 character streams
 *    它被硬编码为仅 encode/decode 与较低的 127 ASCII 字符(IOS-8859-1, windows-1252, UTF-8等)兼容的字符编码
 * </p>
 * <p>此类不是线程安全的，每个线程应使用其自己的实例</p>
 *//*

public class MyBase64 {
    */
/**
     * BASE32字符的长度为 6 位，通过采用 3 个八位位组组成一个 24 位字符串，将其转换为 4 个 BASE64 字符串来组成它们。
     *//*

    private static final int BITS_PER_ENCODED_BYTE = 6;

    private static final int BYTES_PER_UNENCODED_BLOCK = 3;

    private static final int BYTES_PER_ENCODED_BLOCK = 4;

    */
/**
     * 换行符
     *//*

    static final byte[] CHUNK_SEPARATOR = {'\r', '\n'};

    */
/**
     * 此数组是一个查找表，该表将 6 位正整数索引转换为 RFC 2045
     *//*

    private static final byte[] STANDARD_ENCODE_TABLE = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
            'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
            'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1',
            '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};

    */
/**
     * 这是上面 STANDARD_ENCODE_TABLE 的副本，但是 + 和 / 更改为 - 和 _ 以使编码的 Base64 结果更 URL-SAFE
     * 仅当 Base64 的模式设置为 RUL-SAFE 时，才使用此表
     *//*

    private static final byte[] URL_SAFE_ENCODE_TABLE = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
            'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
            'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1',
            '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'};

    */
/**
     * 此数组是一个查找表，从 Base64字母中抽取的 Unicode 字符转换为 6 位正整数等效项
     * 不在 Base64 字符中，但在数组范围内的字符将转换为 -1
     * <p>注意：+ 和 - 都解码为 62. / 和 _ 都解码为 63。这意味着解码器可以无缝处理 URL_SAFE 和 STANDARD base64</p>
     *//*

    private static final byte[] DECODE_TABLE = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1,
            62, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8,
            9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29,
            30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51};

    */
/**
     * Base64使用 6 位字段，用于提取 6 位的掩码，在编码时使用. 十六进制 0x3f 等于十进制 63
     *//*

    private static final int MASK_4BITS = 0x3f;

    */
/**
     * encode 表使用: STANDARD or URL_SAFE.
     *//*

    private final byte[] encodeTable;

    */
/**
     * 当前只有一个解码表, 与 Base32 保持一致
     *//*

    private final byte[] decodeTable = DECODE_TABLE;

    */
/**
     * 用于编码的行分隔符，解码时不使用，仅在 lineLength > 0 时使用
     *//*

    private final byte[] lineSeparator;

    */
/**
     * 辅助变量，帮助确定缓冲区何时将耗尽空间并需要调整大小
     * <code>decodeSize=3 + lineSeparator.length;</code>
     *//*

    private final int decodeSize;

    */
/**
     * 辅助变量，帮助确定缓冲区何时将耗尽空间并需要调整大小
     * <code>encodeSize=4+lineSeparator.length</code>
     *//*

    private final int encodeSize;

    */
/**
     * 占位符，用于处理基于逻辑的字节。按位运算可存储和提取此变量的编码或解码
     *//*

    private int bitWorkArea;

    */
/**
     * 创建用于解码和URL不安全模式下编码的Base64编解码器
     * <p>编码时，行长为 0(无分块)，编码表为 STANDARD_ENCODE_TABLE</p>
     * <p>解码时支持所有变量</p>
     *//*

    public MyBase64() {
        this(0, CHUNK_SEPARATOR, false);
    }

    public MyBase64(int lineLength, byte[] lineSeparator, boolean urlSafe) {
        chunkSeparatorLength = lineSeparator == null ? 0 : lineSeparator.length;
        unencodedBlockSize = BYTES_PER_UNENCODED_BLOCK;
        encodedBlockSize = BYTES_PER_ENCODED_BLOCK;
        this.lineLength = (lineLength > 0 && chunkSeparatorLength > 0) ? (lineLength / encodedBlockSize) * encodedBlockSize : 0;
        if (lineSeparator != null) {

        }
    }

    */
/**
     * 符合 RFC 2045 的 MIME 块大小
     * <p>{@value}字符数限制不计算结尾的 CRLF，而不是计算所有其它字符，包括任何等号</p>
     *//*

    private static final int MIME_CHUNK_SIZE = 76;

    private static final int DEFAULT_BUFFER_RESIZE_FACTOR = 2;

    */
/**
     * 定义默认缓冲区大小，必须足够大，以用于至少一个编码后的 block + separator
     *//*

    private static final int DEFAULT_BUFFER_SIZE = 8192;

    */
/**
     * 用于提取8位的掩码，用于解码字节。
     *//*

    private static final int MASK_8BITS = 0xff;

    */
/**
     * 用于填充输出的字节。
     *//*

    private static final byte PAD_DEFAULT = '=';

    private static final byte PAD = PAD_DEFAULT;

    */
/**
     * 每个未编码数据的完整块中的字节数，例如对于 Base64 为 4，对于 Base32为5
     *//*

    private final int unencodedBlockSize;

    */
/**
     * 每个完整的编码数据块中的字节数，例如对于Base64为 3，对于Base32为8
     *//*

    private final int encodedBlockSize;

    */
/**
     * 块大小进行编码。解码时不使用。零活更少的表表示不对编码数据进行分块。向下舍入为 encodeBlockSize的最接近倍数
     *//*

    private final int lineLength;

    */
/**
     * 当前只有一个解码表，与 Base32 保持一致
     *//*

    private final int chunkSeparatorLength;

    */
/**
     * 用于流的缓冲区
     *//*

    private byte[] buffer;

    */
/**
     * 下一个字符应写入缓冲区的位置
     *//*

    private int pos;

    */
/**
     * 应该从缓冲区读取下一个字符的位置
     *//*

    private int readPos;

    */
/**
     * 表示是否达到 EOF，一旦达到 EOF，该对象将变得无用，必须将其丢弃
     *//*

    private boolean eof;

    */
/**
     * 变量跟踪已将多个字符写入当前行。仅在编码是使用，使用它来确保每个编码行都不会超出 lineLength
     *//*

    private int currentLinePos;

    */
/**
     * 仅在编码时每 3/5 次读取，解码时每 4/8次读取之后才写入缓冲区，有助于变量跟踪
     *//*

    private int modules;
}
*/
